#pragma once

#include <iostream>
#include <string>
#include <cstdarg>
#include <ctime>
#include <unistd.h>

#define LOG_NORMAL "log.txt"
#define LOG_ERR "log.error"

#define DEBUG   0
#define NORMAL  1
#define WARNING 2
#define ERROR   3
#define FATAL   4

const char * to_levelstr(int level)
{
    switch(level)
    {
        case DEBUG : return "DEBUG";
        case NORMAL: return "NORMAL";
        case WARNING: return "WARNING";
        case ERROR: return "ERROR";
        case FATAL: return "FATAL";
        default : return nullptr;
    }
}

// void logMessage(DEBUG, "hello %f, %d, %c", 3.14, 10, 'C');
#define NUM_ 1024
void logMessage(int level, const char *format...)//可变参数列表
{  
     
    // [日志等级] [时间戳/时间] [pid] [messge]
    // [WARNING] [2023-05-11 18:09:08] [123] [创建socket失败]
    // va_list start; //    
    // va_start(start);//指向参数的第一个
    // while(*p){
    //     switch(*p)
    //     {
    //         case '%':
    //             p++;
    //             if(*p == 'f') arg = va_arg(start, float);//指针向后移动的指定的大小
    //         ...
    //     }
    // }
    // va_end(start); 
// #define NUM 1024
//     char logprefix[NUM];
//     snprintf(logprefix, sizeof(logprefix), "[%s][%ld][pid: %d]",
//         to_levelstr(level), (long int)time(nullptr), getpid());

//     char logcontent[NUM];
//     va_list arg;
//     va_start(arg, format);
//     vsnprintf(logcontent, sizeof(logcontent), format, arg);

//     // std::cout << logprefix << logcontent << std::endl;

//     FILE *log =  fopen(LOG_NORMAL, "a");
//     FILE *err = fopen(LOG_ERR, "a");
//     if(log != nullptr && err != nullptr)
//     {
//         FILE *curr = nullptr;
//         if(level == DEBUG || level == NORMAL || level == WARNING) curr = log;
//         if(level == ERROR || level == FATAL) curr = err;
//         if(curr) fprintf(curr, "%s%s\n", logprefix, logcontent);

//         fclose(log);
//         fclose(err);
//     }
  char logprefix[NUM_];//获取错误的等级，时间戳，pid
  snprintf(logprefix,sizeof(logprefix),"[%s][%d][pid:%d]",to_levelstr(level),(unsigned int)time(nullptr),getpid());//向数组中打印前缀

  char loglastfix[NUM_];//获取错误的网络通信文件描述符
  va_list ag;//多参数的定义，指向可变参数的可变部分
  va_start(ag,format);//定义多参数的起始位，参数的压栈从右向左，
  vsnprintf(loglastfix,sizeof(loglastfix),format,ag);//通过多参数的接口，进行转换,将内容写入数组
  FILE* log=fopen(LOG_NORMAL,"a");//打开正常的日志的文件
  FILE* err=fopen(LOG_ERR,"a");//打开存储错误日志的文件
  if(log!=nullptr&&err!=nullptr)
  {
    FILE* curr=nullptr;
    if(level==DEBUG||level==NORMAL||level==WARNING)curr=log;
    if(level==ERROR||level==FATAL)curr=err;
    if(curr!=nullptr)
    {
        fprintf(curr,"%s%s\n",logprefix,loglastfix);//打印日志到指定的文件，向文件中打印
    }
    fclose(log);
    fclose(err);
  }



}